'''
NurbsCad
Archivo xmlParser utilizado principalmente por el gui.py
Autor: Gustavo Enrique Bellino
Contacto: gushbellino@gmail.com
Fecha: Junio de 2009
Descripcion: archivo que dispone de una clase que permite dibujar y manipular las propiedades de una NURBS
Licencia: GNU Public License version 2
'''

#Importa las librerias necesarias
from xml.dom.minidom import Document
from xml.dom.minidom import parse
from xml.dom import minidom

class xmlNurbParser:
    ''' Clase que guarda y abre un archivo xml con los objetos NURBS generados.'''
    def readXml(self, pathFile):
        ''' Abre un archivo xml con un elemento NURBS generado'''
        xmldoc = minidom.parse(pathFile)
        nurbs = []
        pts = []
        Elementos = xmldoc.childNodes[0].childNodes
        cont = 0
        for nurb in Elementos:
            nombre = Elementos[cont].attributes.get('name').value 
            u = nurb.getElementsByTagName("u")[0].attributes.get('cant').value
            v = nurb.getElementsByTagName("v")[0].attributes.get('cant').value
            ordenU = nurb.getElementsByTagName("ordenU")[0].attributes.get('cant').value
            ordenV = nurb.getElementsByTagName("ordenV")[0].attributes.get('cant').value            
            puntos = nurb.getElementsByTagName("punto")
            for p in puntos:
                pts.append(p.attributes.get('valor').value)
            nurbs.append((nombre, u, v, ordenU, ordenV,  pts))
            pts = []
            cont += 1
        return nurbs

    def writeXml(self, pathFile, elementos):
        ''' Abre un archivo xml con un elemento NURBS generado'''
        # Create the minidom document
        doc = Document()
        nurbs = doc.createElement('NURBS')
        doc.appendChild(nurbs)
        
        #para cada nurb
        for n in range(elementos.__len__()):
            nombre = elementos[n][0]
            u = elementos[n][1]
            v = elementos[n][2]
            oU = elementos[n][3]
            oV = elementos[n][4]
            puntos = elementos[n][5]
            
            #creamos el nodo nurb1
            nurb = doc.createElement("nurb")
            nurb.setAttribute('name', nombre)
            nurbs.appendChild(nurb)
            
            #creamos nodo u y v de la nurb
            nodoU = doc.createElement('u')
            nodoU.setAttribute('cant', str(u))
            nurb.appendChild(nodoU)
            
            nodoV = doc.createElement('v')
            nodoV.setAttribute('cant', str(v))
            nurb.appendChild(nodoV)
            
            ordenU = doc.createElement('ordenU')
            ordenU.setAttribute('cant', str(oU))
            nurb.appendChild(ordenU)
            
            ordenV = doc.createElement('ordenV')
            ordenV.setAttribute('cant', str(oV))
            nurb.appendChild(ordenV)
            
            for p in range(puntos.__len__()):
                punto = doc.createElement('punto')
                punto.setAttribute('valor', str(puntos[p]))
                nurb.appendChild(punto)
 
        #creamos el elemento
        fp = open(pathFile, 'w')
        nurbs.writexml(fp)
        fp.close()

